别名模板(参见第2.8节)在推导方面是“透明的”。只要一个别名模板带有一些模板参数出现，别名定义(等号右边的类型)会替换为参数，产生的结果为推导所用。例如，模板参数推导对下面的三个调用都会成功:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{deduce/aliastemplate.cpp}
\begin{lstlisting}[style=styleCXX]
template<typename T, typename Cont>
class Stack;

template<typename T>
using DequeStack = Stack<T, std::deque<T>>;

template<typename T, typename Cont>
void f1(Stack<T, Cont>);

template<typename T>
void f2(DequeStack<T>);

template<typename T>
void f3(Stack<T, std::deque<T>); // equivalent to f2

void test(DequeStack<int> intStack)
{
	f1(intStack); // OK: T deduced to int, Cont deduced to std::deque<int>
	f2(intStack); // OK: T deduced to int
	f3(intStack); // OK: T deduced to int
}
\end{lstlisting}

第一次调用(对f1())中，在intStack类型中使用别名模板DequeStack对推导没有影响:指定的类型DequeStack<int>可视为其替代类型Stack<int, std::deque<int>{}>。第二次和第三次调用具有相同的涂掉行为，因为f2()中的DequeStack<T>和f3()中的替代形式与Stack<T, std::deque<T>{}>相同。对模板参数推导的目标来说，模板别名是透明的:可以用来区分和简化代码，但是对于推导如何进行却不会产生效果。

因为别名模板不能特化(参见第16章关于模板特化主题的详细信息)，所以这是可能的。假设以下代码可行:

\begin{lstlisting}[style=styleCXX]
template<typename T> using A = T;
template<> using A<int> = void; // ERROR, but suppose it were possible...
\end{lstlisting}

因为A<int>和A<void>都等于void，所以不能将A<t>与void类型匹配，并得出结论T一定是void。因为别名的每次使用都可以根据其定义进行扩展，从而使别名可以进行透明地推导。

























